package com.vegetable.common.async;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.vegetable.modules.entity.wx.WXApproval;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.message.WxCpMessage;
import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 异步企业微信通知服务
 * 用于处理耗时的企业微信通知操作，避免影响主流程
 */
@Slf4j
@Service
public class AsyncWechatService {
    
    @Autowired
    private WxCpService wxCpService;
    
    /**
     * 异步同步审批状态到企业微信
     * 
     * @param approval 审批记录
     * @param status 状态
     */
    @Async
    public void syncApprovalStatusToWechat(WXApproval approval, String status) {
        if (approval == null) {
            log.warn("审批记录为空，无法同步状态到企业微信");
            return;
        }
        
        String spNo = approval.getSpNo();
        String userId = approval.getUserId();
        
        try {
            log.info("异步同步审批状态到企业微信，审批编号: {}, 状态: {}", spNo, status);
            
            if (userId == null || userId.trim().isEmpty()) {
                log.warn("审批记录中缺少申请人信息，审批编号: {}", spNo);
                return;
            }
            
            // 构造消息内容
            String content = buildNotificationContent(approval, status);
            
            // 使用企业微信SDK发送文本消息
            WxCpMessage message = WxCpMessage.TEXT()
                .toUser(userId)
                .content(content)
                .build();

            WxCpMessageSendResult result = wxCpService.getMessageService().send(message);
            
            log.info("异步同步审批状态到企业微信成功，已发送通知消息，审批编号: {}, 申请人: {}, 结果: {}", 
                    spNo, userId, JSONObject.toJSONString(result));
        } catch (WxErrorException e) {
            log.error("异步同步审批状态到企业微信时发生微信异常，审批编号: {}, 错误码: {}, 错误信息: {}", 
                    spNo, e.getError().getErrorCode(), e.getError().getErrorMsg(), e);
        } catch (Exception e) {
            log.error("异步同步审批状态到企业微信时发生异常，审批编号: {}", spNo, e);
        }
    }
    
    /**
     * 构建通知消息内容
     * 
     * @param approval 审批记录
     * @param status 状态
     * @return 消息内容
     */
    private String buildNotificationContent(WXApproval approval, String status) {
        String spNo = approval.getSpNo();
        String approvalContent = approval.getApprovalContent();
        BigDecimal money = approval.getMoney();
        
        // 格式化金额
        String moneyStr = "";
        if (money != null) {
            DecimalFormat df = new DecimalFormat("#,##0.00");
            moneyStr = df.format(money);
        }
        
        if ("ALREADY_PAY".equals(status)) {
            StringBuilder content = new StringBuilder();
            content.append("【付款通知】\n\n");
            content.append("您的付款申请已支付完成。\n\n");
            content.append("审批编号：").append(spNo).append("\n");
            
            // 添加报销内容
            if (StrUtil.isNotBlank(approvalContent)) {
                content.append("报销内容：").append(approvalContent).append("\n");
            }
            
            // 添加金额
            if (money != null) {
                content.append("支付金额：¥").append(moneyStr).append("\n");
            }
            
            content.append("支付时间：").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).append("\n\n");
            content.append("请注意查收！");
            
            return content.toString();
        }
        
        StringBuilder content = new StringBuilder();
        content.append("【审批状态更新】\n\n");
        content.append("您的审批状态已更新。\n\n");
        content.append("审批编号：").append(spNo).append("\n");
        
        // 添加报销内容
        if (StrUtil.isNotBlank(approvalContent)) {
            content.append("报销内容：").append(approvalContent).append("\n");
        }
        
        // 添加金额
        if (money != null) {
            content.append("审批金额：¥").append(moneyStr).append("\n");
        }
        
        content.append("当前状态：").append(status).append("\n");
        content.append("更新时间：").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        
        return content.toString();
    }
}
